'use client'; import { useState } from 'react'; import { useTranslations } from 'next-intl'; interface ResendVerificationEmailProps { email: string; locale: string; } export default function ResendVerificationEmail({ email, locale }: ResendVerificationEmailProps) { const [isLoading, setIsLoading] = useState(false); const [message, setMessage] = useState(''); const [messageType, setMessageType] = useState<'success' | 'error' | ''>(''); const [cooldownRemaining, setCooldownRemaining] = useState(0); const t = useTranslations('auth.verifyEmailSent'); const tErrors = useTranslations('auth.errors'); const handleResend = async () => { if (isLoading || cooldownRemaining > 0) return; setIsLoading(true); setMessage(''); setMessageType(''); try { const response = await fetch('/api/auth/resend-verification', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, locale }), }); const data = await response.json(); if (response.ok) { setMessage(data.message); setMessageType('success'); // 启动冷却期倒计时 if (data.cooldownMinutes) { setCooldownRemaining(data.cooldownMinutes * 60); // 转换为秒 const countdown = setInterval(() => { setCooldownRemaining((prev) => { if (prev <= 1) { clearInterval(countdown); return 0; } return prev - 1; }); }, 1000); } } else { if (response.status === 429) { // 冷却期错误 setMessage(data.error); setMessageType('error'); // 从错误消息中提取冷却时间(简化处理) setCooldownRemaining(5 * 60); // 5分钟 } else if (response.status === 400 && data.error.includes('已经验证')) { setMessage(data.error); setMessageType('success'); } else { setMessage(data.error || tErrors('networkError')); setMessageType('error'); } } } catch (error) { setMessage(tErrors('networkError')); setMessageType('error'); } finally { setIsLoading(false); } }; const formatCooldownTime = (seconds: number): string => { const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; }; const isDisabled = isLoading || cooldownRemaining > 0; return (